//
//  HomeViewController.swift
//  SinaBlog
//
//  Created by 李超 on 16/3/20.
//  Copyright © 2016年 lichao. All rights reserved.
//

import UIKit
import SVPullToRefresh
import SVProgressHUD

//显示加载信息的情况
class HomeViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //去过还没有登录过，则不需要往下执行,避免会覆盖登录界面的按钮
        if (CZUserAccountTool.shareInstance.userAccount == nil) {
           return
        }
        //设置关于自动布局的属性,使cell的高度根据约束来进行变化
        //tableView.estimatedRowHeight = 100//使用返回高度的函数后不需要设置预定高度
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        //        //将下载显示的view添加到
//        tableView.addSubview(refleshView)
//        refleshView.frame.origin.y = -64
        //通过封装过后的方法来实现下拉刷新
       tableView.addPullDownRefleshCompletionHandler {[weak self] () -> () in
             self?.loadStatuseInfo()
        }
        //调用下拉刷新方法
        tableView.startRefleshing()
        //设置导航栏
        setupNavigationBar()
        //注册cell
        tableView.registerClass(TCZStatusCell.self, forCellReuseIdentifier: "cell")
    }
    //保存数据的属性
    var statuses:[CZStatuses]?{
        didSet{
            //设置属性时，更新tableViewde数据
            tableView.reloadData()
        }
    }
    //显示加载信息
    func showPullDownTips(tips:Int){
        //再快速下拉刷新时，会出现动画叠加的情况，需要提前移除前面的动画,UIView动画本质也是核心动画
       let animationKeys = refleshMessageLable.layer.animationKeys()
        print("\(animationKeys)")
        //如果正在动画则表示有值,将原来的动画全部都删除，执行新的动画
        if animationKeys?.count > 0 {
        
            refleshMessageLable.layer.removeAllAnimations()
        }
        
        refleshMessageLable.text = tips > 0 ? "更新了\(tips)条微博" : "没有新微博"
        let durationTime = 0.75
        //开始做动画
        UIView.animateWithDuration(durationTime) { () -> Void in
            self.refleshMessageLable.frame.origin.y = 44.0
        }
        //使用能延时的动画，增加体验
        UIView.animateWithDuration(durationTime, delay: 1.0, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
            self.refleshMessageLable.frame.origin.y = -64.0
            }, completion: nil)
    
    }
    //上拉刷新
    func loadMoreDatas(){
        
       let max_id = self.statuses?.last?.id ?? 0
        //如果没有数据，则直接返回,不执行加载操作
        if max_id == 0{
            return
        }
        
        CZStatusesViewModel.shareInstance.loadUserStatusesInfo(0, max_id: max_id) { (statuses, error) -> () in
            //调用已完成刷新的方法
            self.tableView.infiniteScrollingView.stopAnimating()
            if (statuses == nil) {
                SVProgressHUD.showErrorWithStatus("下拉刷新出错")
                return
            }
            //判断返回的数据是否为nil
            if statuses?.count > 0 {
                //如果有返回数据，则添加到原来的数组末尾
              self.statuses = self.statuses! + statuses!
                
            }
            
        }
        
    
    }
    //加载微博信息，下拉加载
    func loadStatuseInfo(){
        //获得数组第一个元素的id值,若果有值则返回，无值，则默认0
        let since_id = self.statuses?.first?.id ?? 0
        
        CZStatusesViewModel.shareInstance.loadUserStatusesInfo(since_id, max_id: 0, finished: {(statuses, error) -> () in
            //完成加载
            self.tableView.endRefleshing()
            
            if (error != nil) {
                
                return
            }
            //判断id是否为零
            if since_id > 0{
                //判断返回的信息是否为零
                let count = statuses?.count ?? 0
                self.showPullDownTips(count)
                if count > 0{
                 print("刷新了\(count)条微博")
                    
                self.statuses = statuses! + self.statuses!
                }else{
                    //没有最新数据
                    print("刷新了\(count)条微博")
                }
            }else{
                //表示为第一次刷新
                print("登陆")
                self.statuses = statuses
                //使用第三方实现上拉刷新,只有在第一次刷新有数据之后，才需要上拉刷新功能，否则没有意义,同时避免程序启动时，用户乱拉，导致同时上拉和下拉刷新数据
                self.tableView.addInfiniteScrollingWithActionHandler {[weak self] () -> Void in
                    
                    self?.loadMoreDatas()
                }
                
            }
       
        })
        
    
    }
    //设置tableView的左右按钮
    func setupNavigationBar(){
        
        let leftBarButton = UIBarButtonItem(imageName: "navigationbar_friendsearch", hightLightImageName: "navigationbar_friendsearch_highlighted", target: self, action: "leftBarButtonAction", Events: UIControlEvents.TouchUpInside)
        navigationItem.leftBarButtonItem = leftBarButton
        
        let rightBarButton = UIBarButtonItem(imageName: "navigationbar_pop", hightLightImageName: "navigationbar_pop_highlighted", target: self, action: "rightBarButtonAction", Events: UIControlEvents.TouchUpInside )
        let title = CZUserAccountTool.shareInstance.userAccount?.screen_name
        let button = CZTitleView(title: title!)
        
        navigationItem.titleView = button
        navigationItem.rightBarButtonItem = rightBarButton
        //给按钮添加事件
        button.addTarget(self, action: "homeTitleViewAction:", forControlEvents: UIControlEvents.TouchUpInside)
        
    }
    ///左侧按钮点击,私有化之后的方法如果需要系统调用，需要加上@Objc，否则系统无法调用
    @objc private func rightBarButtonAction(){
        print("\(__FUNCTION__)")
    }
    
    @objc private func leftBarButtonAction(){
       print("\(__FUNCTION__)")
    }
    //相应点击事件
    @objc private func homeTitleViewAction(button:CZTitleView){
       //每点击一次则旋转180°
       button.selected = !button.selected
       var transform = CGAffineTransformIdentity
       if button.selected{
               transform = CGAffineTransformRotate(transform,CGFloat( M_PI)-0.00001)
                
            }else{
               transform = CGAffineTransformIdentity
            }
            
        UIView.animateWithDuration(0.25, animations: { () -> Void in
            
               button.imageView?.transform = transform
            }, completion: nil)
        //如果是选中状态，则展开视图
        if button.selected{
            
            let popOverVC = PopOverViewController()
            //设置模式
            popOverVC.modalPresentationStyle =  UIModalPresentationStyle.Popover
            //设置视图相对于那个源始图进行展示
            popOverVC.popoverPresentationController?.sourceView = navigationItem.titleView
            
            //设置视图相对于那个位置进行展示
            popOverVC.popoverPresentationController?.sourceRect = (navigationItem.titleView?.bounds)!
            //设置代理
            popOverVC.popoverPresentationController?.delegate = self
            //设置视图的大小
            popOverVC.preferredContentSize = CGSizeMake(200, 200)
            //进行Model控制器
            presentViewController(popOverVC, animated: true, completion: nil)
        }
        
    }
    //用于显示刷新信息的lable
    private lazy var refleshMessageLable:UILabel = {
        //信息lable的高度
        let tipsLableHeight:CGFloat = 44.0
        let lable = UILabel(frame: CGRect(x: 0.0, y: -20.0 - tipsLableHeight, width: UIScreen.mainScreen().bounds.width, height: tipsLableHeight))
        
        lable.font = UIFont.systemFontOfSize(16)
        lable.textColor = UIColor.whiteColor()
        lable.backgroundColor = UIColor.orangeColor()
        lable.textAlignment = NSTextAlignment.Center
        
        self.navigationController?.navigationBar.insertSubview(lable, atIndex: 0)
        
        return lable
    }()
//    private lazy var refleshView:PullDownRefreshControl = PullDownRefreshControl()
//    
    
}
//通过拓展来实现代理
extension HomeViewController:UIPopoverPresentationControllerDelegate{
    
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        
        return UIModalPresentationStyle.None
    }
    
    //在此方法中调用点击titleView方法，避免出现箭头不向下转的情况
    func popoverPresentationControllerShouldDismissPopover(popoverPresentationController: UIPopoverPresentationController) -> Bool {
        
        let button = navigationItem.titleView as! CZTitleView
        //模拟点击事件
        homeTitleViewAction(button)
        return true
    }
    
    
}

//通过拓展来实现数据源方法或者相关的tableView代理方法
extension HomeViewController{
    
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //有数据时返回数据，没有数据时返回0
        return statuses?.count ?? 0
    }
    //返回对应的cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //使用带indexPath的会调用两次返回行高的函数
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! TCZStatusCell
        let status = statuses?[indexPath.row]
        cell.status = status
        
        return cell
    }
    //重写返回行高的函数，将行高保存到模型中，避免重复计算，消耗性能
   override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        if let height = self.statuses![indexPath.row].cellHeight{
            //有缓存值,直接返回
          //  print("缓存高度")
            return height
            
        }
        //如果没有，则计算出对应模型的cell的高度，并缓存起来
        //重缓存中取出cell，用于计算模型对应的cell的高度
        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! TCZStatusCell
        let status = self.statuses![indexPath.row]
        //将模型赋值给cell，通过cell继续计算高度
        cell.status = status
        let cellHeight = cell.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
        //获得计算后的高度，并使用对应模型中的属性缓存起来
        status.cellHeight = cellHeight
        //返回高度
        //print("计算高度")
        return cellHeight
    }
    //将高亮关闭
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }
    

}




